# 五、集合set
"""
为什么需要学习新的集合类型呢？

通过特性来分析:
1. 列表可以修改、支持重复元素且有序
2. 元组、字符串不可修改、支持重复元素且有序
但是以上容器存在局限性: 都支持重复元素且有序

所以未来场景需要对内容做去重处理，那么列表、元组和字符串就不方便了
而集合最主要的特点就是: 不支持重复元素(自带去重功能)、并且打印的内容是有序的
"""

# 5.1 集合的定义格式
"""
列表使用: []
元组使用: ()
字符串使用: ""
集合使用: {}

基本语法：变量名 = {元素1, 元素2, 元素3, ..., 元素N)
定义空集合：变量名 = set()。注意不能使用->变量名={}来定义空集合，这是定义字典的！！！
"""
my_set = {7,6,5,4,4,3,3,2,2,1}
print(f"my_set:{my_set}, 其类型为:{type(my_set)}")
# my_set:{1, 2, 3, 4, 5, 6, 7}, 其类型为:<class 'set'>
# 我们发现: 打印出的集合对象的元素是有序的(小到大)，并且无重复元素

# 5.2 集合的常见操作
"""
方法一: 添加新元素
语法: 对象.add(元素)
"""
my_set = {7,6,5,4,4,3,3,2,2,1}
my_set.add("hello")
print(f"my_set:{my_set}") # {1, 2, 3, 4, 5, 6, 7, 'hello'}


"""
方法二: 移除元素
语法: 对象.remove(元素)
"""
my_set = {7,6,5,4,4,3,3,2,2,1,'hello'}
my_set.remove('hello')
print(f"移除hello后:{my_set}")

"""
方法三: 随机取出一个元素
语法: 对象.pop()
"""
my_set = {7,6,5,4,4,3,3,2,2,1,'hello'}
get_random = my_set.pop()
print(get_random)

"""
方法四: 清空集合
语法: 对象.clear()
"""
my_set = {7,6,5,4,4,3,3,2,2,1,'hello'}
my_set.clear()
print(my_set)

"""
方法五: 取两个集合的差集
语法: 集合1.difference(集合2)
功能: 结果是集合1有而集合2没有的元素。集合1和集合2不会发生改变
"""
set1 = {1,2,3}
set2 = {1,5,6}
set3 = set1.difference(set2)
print(set3) # {2, 3}

"""
方法六: 消除两个集合的差集
语法: 集合1.difference_update(集合2)
功能: 在集合1中，删除和集合2相同的元素。注意: 集合1会被修改，而集合2不会被修改
"""
set1 = {1,2,3}
set2 = {1,5,6}
set1.difference_update(set2) # 在集合1中，删除和集合2相同的元素，也就是删除了集合1中的1
print(set1) # {2, 3}

"""
方法七: 两个集合合并
语法: 集合1.union(集合2)
功能: 将集合1和集合2组合成新集合。集合1和集合2不会发生改变
"""
set1 = {1,2,3}
set2 = {1,5,6}
new_set = set1.union(set2)
print(new_set) # {1, 2, 3, 5, 6}

"""
方法八: 统计集合元素数量
语法: len(集合对象)
注意: 得到的是去重后的元素个数
"""
my_set = {7,6,5,4,4,3,3,2,2,1,'hello'}
print(f"集合{my_set}的元素个数为{len(my_set)}") # 8

# 5.3 集合的遍历
# 注意: 集合的遍历不能使用while循环，因为set不支持下标访问
# 但是可以使用for循环
my_set = {7,6,5,4,4,3,3,2,2,1,'hello'}
for element in my_set: # 将my_set集合对象的元素依次赋值给element变量
    print(element, end=" ")
print()

# 5.4 集合的特点
"""
1. 不支持重复元素(自带去重功能)、并且打印的内容是有序的
2. 因为集合是无序的(洗牌排序)，所以不支持下标索引访问
3. 所以集合不是序列，不支持切片操作
4. 集合和列表一样，是允许修改的
5. 集合支持存储不同类型的元素
6. 支持for循环而不支持while循环
"""

# 5.5 使用案例
"""
有如下列表对象:my_list =[黑马程序员', '传智播客，'黑马程序员', '传智播客', 'itheima',
'itcast','itheima','itcast','best']

请:
定义一个空集合
通过for循环遍历列表
在for循环中将列表的元素添加至集合
最终得到元素去重后的集合对象，并打印输出
"""
my_list =['黑马程序员', '传智播客', '黑马程序员', '传智播客', 'itheima','itcast','itheima','itcast','best']
my_set = set()
for element in my_list:
    my_set.add(element)
print(my_set)